﻿//#include <iostream>
//#include <variant>
//#include <vector>
//#include <list>
//#include <set>
//
//template<class ...Ts>
//struct overloaded : Ts ...{using Ts::operator()...; };
//
//template<class ...Ts>
//overloaded(Ts ...)->overloaded<Ts ...>;
//
//template<class K, size_t Len = 8>
//class HashTable {
//	using Value = std::variant<std::list<K>, std::set<K>>;
//public:
//	HashTable(): _t(10){}
//
//	void Insert(const K& key) {
//		size_t index = key % _t.size();
//
//		// 链表插入
//		auto listInsert = [this, &key, index](std::list<K>& lt) {
//			if (lt.size() < Len) lt.push_back(key);
//			else {
//				// 大于 8 转换插入到红黑树 set
//				std::set<K> s(lt.begin(), lt.end());
//				s.insert(key);
//				_t[index] = move(s);
//			}
//		};
//		// 红黑树插入
//		auto setInsert = [&key](std::set<K>& s) {
//			s.insert(key);
//		};
//		std::visit(overloaded{ listInsert, setInsert }, _t[index]);
//	}
//
//	bool Find(const K& key){
//		size_t index = key % _t.size();
//
//		// 链表查找 
//		auto listFind = [&key](std::list<K>& lt) ->bool{
//				return std::find(lt.begin(), lt.end(), key) != lt.end();
//		};
//		// 红黑树查找 
//		auto setFind = [&key](std::set<K>& s) ->bool{
//				return s.count(key);
//		};
//		return std::visit(overloaded{listFind,setFind}, _t[index]);
//	}
//
//private:
//	std::vector<Value> _t;
//};
//
//int main(){
//	HashTable<int> ht;
//	for (size_t i = 0; i < 10; i++){
//		ht.Insert(i * 10 + 5);
//	}
//	std::cout << ht.Find(15) << std::endl;
//	std::cout << ht.Find(3) << std::endl;
//	return 0;
//}
